import java.util.*;
import java.util.stream.Collectors;

public class ListClass {
    public static void main(String[] args) {

        int[] arr1 = { 1, 2, 3 };
        arr1[1] = 7;
        Arrays.stream(arr1).forEach(System.out::println);

        // 默认值 0
        int[] arr2 = new int[5];
        arr2[0] = 8;
        for(int i : arr2){
            System.out.println(i);
        }

        // 多维
        int[][] arr3 = { { 1, 2 }, { 3, 4 }, { 5, 6 } };


        System.out.println("================================");


        // List 数组实现，查询快、增删慢
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(2);
        list1.add(2);
        list1.add(2);
        list1.add(2);
        list1.forEach(System.out::println);
        List<Integer> ls2 = list1.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());

        Integer[] ls3 = list1.stream().filter(x -> x % 2 == 0).toArray(Integer[]::new);
        Integer[] ls4 = list1.stream().filter(x -> x % 2 == 0).toArray(i -> new Integer[i]);
        String strLs3 = Arrays.toString(ls3);
//        String strJoin = list1.stream().
        System.out.println(strLs3);
        System.out.println(strLs3.length());
        System.out.println(strLs3 instanceof String);

        List<String> s1 = new ArrayList<>();
        s1.add("1");
        s1.add("1");
        s1.add("1");
        String[] s2 = { "1", "2" };


        // -------------- 数组join --------------

        // String list | String Array  =>  to JOIN  通过String.join
        System.out.println(String.join(", ", s1));
        System.out.println(String.join(",", s2));
        // 通用场景可非String[]
        // Stream 方式
        String s3 = list1.stream().map(integer -> String.valueOf(integer)).collect(Collectors.joining(","));
        String s4 = list1.stream().map(String::valueOf).collect(Collectors.joining(","));
        System.out.println(s3); // distinct 去重


        System.out.println("================================");

        // LinkedList（链表实现，增删快、查询慢）
        List<Integer> list2 = new LinkedList<>();
        list2.add(1);
        list2.add(2);
        list2.forEach(System.out::println);

        // 方式3：Vector（线程安全，效率低，少用，类似ArrayList）
        List<Integer> list3 = new Vector<>();

        // 固定长度 底层是数组 但不支持增加与修改
        List<Integer> list4 = Arrays.asList(1, 2, 3);
        // list4.add(4);
        list4.forEach(System.out::println);

        Integer[] arr4 = { 1, 2, 3 };
        List<Integer> list5 = Arrays.asList(arr4);
        list5.forEach(System.out::println);

        // 不可修改
        List<Integer> list6 = List.of(1, 2, 3);


        System.out.println(" ----------------- Set ------------------");
        // ------------------- Set (与List都具有Stream接口) --------------------
        // HashSet 不重复 哈希表（数组+链表/红黑树） 无序
        Set<String> set1 = new HashSet<>();
        HashSet<String> set2 = new HashSet<>();
        set1.add("1");
        set1.add("2");
        set1.add("3");
        System.out.println(set1);
        // LinkedHashSet 哈希表 + 双向链表 有序
        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("1");
        linkedHashSet.add("2");
        linkedHashSet.add("3");
        linkedHashSet.add("4");
        System.out.println(linkedHashSet);
        // TreeSet 红黑树 大小顺序
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("1");
        treeSet.add("2");
        System.out.println(treeSet);


    }
}
